package com.wzx.common.util;

import lombok.extern.slf4j.Slf4j;
import org.hibernate.validator.HibernateValidator;
import org.springframework.util.CollectionUtils;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Arrays;
import java.util.Set;

/**
 * @author wzx
 * @version 1.0
 * @date 2022/1/24 - 10:23
 * @description 手动开启校验注解工具类
 */
@Slf4j
public class ValidateUtils {

    /**
     * 发现有异常字段后直接返回，不再继续校验
     */
    public static final Validator VALIDATOR_FAST = Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();

    /**
     * 校验全部的字段，错误信息统一返回
     */
    public static final Validator VALIDATOR_ALL = Validation.byProvider(HibernateValidator.class).configure().failFast(false).buildValidatorFactory().getValidator();


    /**
     * 一次性将所有的错误都校验出来，然后抛出
     *
     * @param obj 需要校验的对象
     */
    public static <T> void validateAll(T obj) {
        Set<ConstraintViolation<T>> messageSet = VALIDATOR_ALL.validate(obj);
        if (CollectionUtils.isEmpty(messageSet)) {
            return;
        }
        String message = Arrays.toString(messageSet.stream().map(ConstraintViolation::getMessage).toArray());
        throw new IllegalArgumentException(message);
    }

    /**
     * 一监测到错误就直接抛出，不再继续往下校验
     *
     * @param obj 需要校验的对象
     */
    public static <T> void validateFast(T obj) {
        Set<ConstraintViolation<T>> messageSet = VALIDATOR_FAST.validate(obj);
        if (CollectionUtils.isEmpty(messageSet)) {
            return;
        }
        throw new IllegalArgumentException(messageSet.iterator().next().getMessage());
    }
}
